package com.lewis.module.m2.api.integral.api;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.lewis.common.core.entity.BaseResult;
import com.lewis.common.core.utils.StringUtil;
import com.lewis.module.m2.api.integral.entity.ImmortalIntegral;
import com.lewis.module.m2.api.integral.service.IImmortalIntegralService;
import com.lewis.module.m2.api.integral.vo.ImmortalIntegralVo;
import com.lewis.module.m2.api.integral.vo.ImmortalVo;
import com.lewis.module.m2.api.integral.vo.ImmortalVo1;
import com.lewis.module.m2.api.integral.vo.RandomGetIntegralVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 修仙积分记录表 前端控制器
 * </p>
 *
 * @author lewis
 * @since 2021-11-23
 */
@Api(tags = "积分")
@RestController
@RequestMapping("/api/immortal/integral")
public class ImmortalIntegralApi {

	@Resource
	private IImmortalIntegralService immortalIntegralService;

	@ApiOperation("获取积分列表")
	@GetMapping("/list")
	public BaseResult list(ImmortalIntegral immortalIntegral) {
		LambdaQueryWrapper<ImmortalIntegral> queryWrapper = new LambdaQueryWrapper<>();
		queryWrapper.eq(StringUtil.isNotNull(immortalIntegral.getQq()), ImmortalIntegral::getQq, immortalIntegral.getQq());
		queryWrapper.like(StringUtil.isNotNull(immortalIntegral.getUtime()), ImmortalIntegral::getUtime, immortalIntegral.getUtime());
		return BaseResult.ok().setData(immortalIntegralService.list(queryWrapper));
	}

	@ApiOperation("修仙api")
	@PostMapping("/immortal")
	public BaseResult immortal(@Validated @RequestBody ImmortalVo vo) {
		return immortalIntegralService.immortal(vo);
	}

	@ApiOperation("新增积分")
	@PostMapping("/add")
	public boolean add(@RequestBody ImmortalIntegral immortalIntegral) {
		// 新增前判断是否存在该qq积分信息
		if (immortalIntegralService.existQqInGroupData(immortalIntegral.getQq(), immortalIntegral.getGroupId())) {
			return false;
		}
		return immortalIntegralService.save(immortalIntegral);
	}

	@ApiOperation("删除积分")
	@PostMapping("/delete/{id}")
	public boolean delete(@PathVariable Integer id) {
		return immortalIntegralService.removeById(id);
	}

	@ApiOperation("删除指定groupId指定qq")
	@PostMapping("/delete")
	public boolean delete(@RequestBody ImmortalVo vo) {
		return immortalIntegralService.remove(new LambdaUpdateWrapper<ImmortalIntegral>().eq(ImmortalIntegral::getQq, vo.getQq()).eq(ImmortalIntegral::getGroupId, vo.getGroupId()));
	}

	@ApiOperation("修改积分")
	@PostMapping("/edit")
	public BaseResult edit(@RequestBody ImmortalIntegralVo vo) {
		// 确保今日数据未修改
		if (immortalIntegralService.existTodayData(vo.getQq(), vo.getGroupId())) {
			return BaseResult.fail().setMsg("修仙失败，今天已经修过仙了！");
		}
		return editNotCheck(vo);
	}

	@ApiOperation("修改积分 - 不限制当天事件")
	@PostMapping("/editNotCheck")
	public BaseResult editNotCheck(@RequestBody ImmortalIntegralVo immortalIntegralVo) {
		LambdaUpdateWrapper<ImmortalIntegral> updateWrapper = new LambdaUpdateWrapper<>();
		updateWrapper.eq(ImmortalIntegral::getQq, immortalIntegralVo.getQq())
				.eq(ImmortalIntegral::getGroupId, immortalIntegralVo.getGroupId())
				.set(ImmortalIntegral::getIntegral, immortalIntegralVo.getIntegral());
		if (immortalIntegralVo.isFlag()) {
			updateWrapper.set(ImmortalIntegral::getUtime, immortalIntegralVo.getUtime());
		}
		return immortalIntegralService.update(updateWrapper) ? BaseResult.ok() : BaseResult.fail();
	}

	@ApiOperation("修改积分 - 用户积分增加时使用")
	@PostMapping("/randomGetIntegral")
	public boolean randomGetIntegral(@Validated @RequestBody RandomGetIntegralVo vo) {
		// 查询到数据
		ImmortalIntegral immortalIntegral = this.getByQq(vo.getQq(), vo.getGroupId());
		if (immortalIntegral == null) {
			return false;
		}
		immortalIntegral.setIntegral(immortalIntegral.getIntegral() + vo.getAddIntegral());
		return immortalIntegralService.updateById(immortalIntegral);
	}

	@ApiOperation("获得qq积分信息")
	@GetMapping("/getByQq")
	public ImmortalIntegral getByQq(String qq, String groupId) {
		return immortalIntegralService.getByQq(qq, groupId);
	}

	@ApiOperation("获得qq排行")
	@GetMapping("/getRankByQq")
	public Integer getRankByQq(String qq, String groupId) {
		return immortalIntegralService.getRankByQq(qq, groupId);
	}

	@ApiOperation("获得前二十排行")
	@GetMapping("/get2TenRank")
	public BaseResult get2TenRank(String groupId) {
		return immortalIntegralService.get2TenRank(groupId);
	}

	@ApiOperation("减少指定群的指定qq的指定积分")
	@PostMapping("/cutImmortalIntegral")
	public BaseResult cutImmortalIntegral(@RequestBody ImmortalVo1 vo) {
		// 根据groupId和qq查到信息
		ImmortalIntegral one = immortalIntegralService.getOne(new LambdaQueryWrapper<ImmortalIntegral>().eq(ImmortalIntegral::getQq, vo.getQq()).eq(ImmortalIntegral::getGroupId, vo.getGroupId()));
		if (one == null) {
			return BaseResult.fail().setMsg("不存在该仙友。");
		}
		int lastNum = one.getIntegral() - vo.getNum();
		List<String> list = new ArrayList<>();
		list.add("本次献祭仙力：" + vo.getNum());
		// 出现负数，禁止执行这个操作
		if (lastNum <= 0) {
			return BaseResult.fail().setMsg("仙力不足以执行本次操作");
		}
		// 减少num积分
		one.setIntegral(lastNum);
		immortalIntegralService.updateById(one);
		return BaseResult.ok().setData(list);
	}
}
